一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树

给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。

输入格式:

输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。

输出格式:

在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

1
2
8
91 71 2 34 10 15 55 18

输出样例:

1
18 34 55 71 2 10 15 91

思路

常规做法是通过后序遍历还原二叉树,再进行层序遍历输出,但十分复杂,这道题可以采用逆向思维,因为完全二叉树层序遍历的某一节点的左右子结点坐标是确定的,分别是i*2i*2+1,再通过在后序遍历左右根的根时,输入该节点数据,进而可以得到完整的层序遍历结果。
tree

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
struct Node{
int data, l, r;
}node[31];
void postOrder(int i) {
if(node[i].l) postOrder(node[i].l);
if(node[i].r) postOrder(node[i].r);
cin >> node[i].data;
}
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
if(i*2 <= n) node[i].l = i*2;
if(i*2+1 <= n) node[i].r = i*2+1;
}
postOrder(1);
for(int i = 1; i <= n; i++) {
if(i > 1) cout << " ";
cout << node[i].data;
}
}